package com.tedu.API.ee;

import org.junit.Test;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常:
 *   Java是一种面向对象的语言，程序中所出现的所有错误都定义为对象【处理对应的错误】
 *
 *   Throwable顶级异常超类(包括:Exception异常和Error错误)
 *   Exception异常: 描述程序级别的错误----有解决方案
 *                 编译期: --RunTimeException异常表示类--
 *                        FileOutputStream创建对象--波浪线--抛出方法之外
 *                 检查异常:通常都是编译器检查处理，程序直接报错
 *                 解决方案:①捕获异常(*)
 *                        ②抛出异常---抛出方法之外---打印控制台
 *                 运行期:控制台直接显示异常对象【异常对象名字以及产生原因】
 *                 非检查异常:控制台直接输出对应异常对象名称 RunTimeException异常表示
 *
 *                 最后了解: 【throw 与throws---RunTimeException】
 *
 *   Error错误: 描述系统级别的错误---一旦出现，程序宕机
 *             出现概率非常低--->递归: 自己调自己【方法问题】--->
 *
 *  Finally和Final的区别【使用】:
 *      final: 修饰类  不可改变类
 *             修饰属性 -不可改变值【常量】
 *             修饰方法: 不可以重写，但可以重载
 *      finally: 处理异常块   功能: 关闭流
 */
public class EE {
    /**
     * Error   错误---无解，程序有严重错误
     * 模拟: 方法调方法---栈溢出错误
     * StackOverflowError: 栈溢出错误
     * ----程序宕机-----
     * while(true){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常: 检查异常【出现在编译期】---代码报波浪线
     *                两种处理手段: ①捕获异常
     *                             语法:try{
     *                                 怀疑代码可能有异常或者提示异常
     *                             }catch(小异常名字 e){
     *                                 e.printStacktrace(); 打印异常信息
     *                             }catch(中异常名字 e){
     *                                 e.printStacktrace(); 打印异常信息
     *                             }catch(大异常名字 e){  Exception
     *                                 e.printStacktrace(); 打印异常信息
     *                             }finally{
     *                                 一定执行的代码块
     *                             }
     *                             快捷键:ctrl+alt+T
     *                            ②抛出异常  throws  异常名字
     *                考试题: throw与throws的区别:
     *                       都是关于异常的关键字
     *               非检查异常【出现在运行期】---代码无错误--控制台
     * -------------------------------------------------------
     * 异常: FileNotFoundException    文件不存在异常
     * 产生原因: 路径写错、文件名写错
     *         FileOutputStream fis=new FileOutputStream("");
     *
     * 异常: NullPointerException   空指针异常
     * 产生原因: 获取字符串为空，数组: 值为空，  集合: 元素为空【存在null值】
     *          String str=null;
     *
     * 异常: StringIndexOutOfBoundsException   字符串下标越界异常
     * 产生原因: 字符串当中出现。字符串下标没有对应字符
     *          str.charAt(1);
     *
     * 异常: NumberFormatException  数字转换异常
     * 产生原因: 字符串不是正确的类型
     *          Integer.parseInt(str);
     *
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现在编译期】---代码报波浪线
       // FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现在运行期】---控制台显示
        //CTRL+ALT+T打印异常信息
        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str); //解析字符串--转换为对应类型
        }catch (StringIndexOutOfBoundsException e){
            e.printStackTrace(); //打印异常对象信息
            System.out.println("字符串小异常: 下标越界异常");
        } catch (NumberFormatException e) {
            e.printStackTrace();  //打印异常的信息
            System.out.println("字符串当中的小异常");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("大异常");
        } finally {
            System.out.println("一定执行的代码块");
        }
    }
    /**
     * 作业1: 写出除上述以外的五个非检查异常的代码示例
     * 提示: 查API---java.lang.异常
     *      字符串、包装类、集合、 IO流(自成一脉的异常)有大量异常
     */
    @Test
    public void testHomeWork1() throws FileNotFoundException {
        //1.java.lang.NoSuchFieldException异常:
        //  表示该类没有指定名称的字段
     /* try {
          Class<?> c= Class.forName("java.util.ArrayList");
          Field field=c.getDeclaredField("nonExistentFiled");
          System.out.println("输出1: ");
      }catch (ClassNotFoundException e){
          System.out.println("输出2: ");
      } catch (NoSuchFieldException e) {
          e.printStackTrace();
          System.out.println("输出3: ");
      }*/

        //java.lang.TypeNotPresentException
        //当应用程序尝试使用表示类型名称的字符串访问类型时抛出，
        // 但没有找到具有指定名称的类型的定义。
        // 此异常不同于ClassNotFoundException在ClassNotFoundException是检查的异常，
        // 而此异常是未经检查的。
        /*try{
            List<String> list=null;
            ParameterizedType type=(ParameterizedType) list;
            Class<?> elementType=(Class<?>) type.getActualTypeArguments()[0];
            System.out.println("输出结果: "+elementType.getName());
        }catch (NullPointerException e){
            System.out.println();
        }catch (TypeNotPresentException e){
            System.out.println("输出: "+e.getMessage());
        }finally {
            System.out.println("一定执行的代码块");
        }*/
        //2.java.io.StreamCorruptedException异常:
        //当从对象流读取的控制信息违反内部一致性检查时抛出
        //输出找不到文件
       /* try (ObjectInputStream asd=new ObjectInputStream(new FileInputStream("data"))){
            Object o= asd.readFields();
        }catch (StreamCorruptedException e){
            System.out.println("损坏");
        }catch (IOException | ClassNotFoundException e){
            System.out.println("输出错误: "+e.getMessage());
        }finally {
            System.out.println();
        }*/


        //3.包装类异常: java.lang.NegativeArraySizeException
        //            抛出一个应用程序尝试创建一个负数大小的数组
       /*try{
           int[] negativeLengthArray=new int[-1];
    }catch(NegativeArraySizeException e){
        System.out.println("捕获异常: "+e.getClass().getName());
           System.out.println("异常描述: "+e.getMessage());
           e.printStackTrace();
    }*/

       //4.java.lang.RuntimeException 类下的
        // java.lang.IllegalArgumentException异常：
        //抛出表示一种方法已经通过了非法或不正确的参数
        /*SimpleDateFormat sdf=new SimpleDateFormat("2024-10-24");
        sdf.setLenient(false);
        try{
            String date = null;
            Date parseDate= sdf.parse(null);
            System.out.println("输出: "+parseDate);
        } catch (ParseException e) {
            try {
                throw new IllegalAccessException("再次输出: ");
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            } finally {
                System.out.println("最终输出: ");
            }
        }*/

        //5.IO流异常: EOFException  不停输出-1，除非终止程序
       /* FileOutputStream xcv=new FileOutputStream("example.txt");
        FileInputStream fis=null;
        BufferedInputStream bis=null;
        try {
            fis=new FileInputStream("example.txt");
            bis=new BufferedInputStream(fis);
            while (true){
                int data= 0;
                try {
                    data = bis.read();
                } catch (EOFException e) {
                    e.printStackTrace();
                } finally {
                }
                System.out.println("读取: "+data);
            }
        }catch (IOException e){
            System.out.println("."+e.getMessage());
        }finally {
          try {
          if (bis!=null){
              bis.close();
          }
          if (fis!=null){
              fis.close();
          }
        }catch (IOException e){
              System.out.println("出现错误: "+e.getMessage());
          }
        }*/
    }

    }


